package ca.etsmtl.log120.tp1.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.UnknownHostException;

import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #2
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : MonMenuBar.java
Date cree : 2011-05-15
Date dern. modif. 2015-05-15
 *************************************************** ****
Historique des modifications
 *************************************************** ****
2011-05-15 Version initiale (Yohan Trepanier)
 ***************************************************/

/**
 * Classe responsable de la barre de menu
 */
@SuppressWarnings("serial")
public class MonMenuBar extends JMenuBar {

	//Texte en constantes
	private static final String D_ADRESSE_SERVEUR = "Veuillez entrer l'adresse du serveur de formes: ";
	private static final String D_PORT_SERVEUR = "Veuillez entrer le port sur lequel un serveur de forme est ouvert";
	private static final String D_QUITTER = "Etes-vous certain de vouloir quitter?";
	private static final String CONF_QUITTER = "Fermeture du client";
	private static final String F_PORT_INVALIDE = "Le format du port est invalide, veuillez recommencer et entrer un entier.";
	private static final String N_HOTE_INVALIDE = "Le nom d'hote specifie est invalide";
	private static final String S_INTROUVABLE = "Le serveur est introuvable sur le port ";
	private static final String PORT_INVALIDE = "Le port specifie n'est pas un port  valide, veuillez reessayer avec un autre port";
	private static final int NB_RADIO = 7;

	private static final String DEFAULT_PORT = "10000";
	private static String defaultIP = "127.0.0.1";

	
	@SuppressWarnings("unused")
	private DrawPanel drawPanel;

	//Menu fichier et ses sous-menus
	private JMenu fichier;
	private JMenuItem obtenirFormes;
	private JMenuItem effacer;
	private JMenuItem quitter;

	//Menu ordre et ses sous-items
	private JMenu ordre;
	private JMenuItem[] trierRadio = new JRadioButtonMenuItem[NB_RADIO];
	private JMenuItem triUp = new JRadioButtonMenuItem("Ordre croissant",true);
	private JMenuItem triDown = new JRadioButtonMenuItem("Ordre decroissant", false);

	/**
	 * Constructeur de la barre de menu
	 * @param drawPanel Le panneau de dessin pour avoir acces aux methodes de celui-ci
	 */
	public MonMenuBar(DrawPanel drawPanel){

		//On garde une reference vers le panneau
		this.drawPanel = drawPanel;

		//Mise en place des menus et sous-menus
		fichier = new JMenu("Fichier");
		ordre = new JMenu("Trier par");

		//On ajoute le fichier a la barre de menu
		add(fichier);
		add(ordre);

		//On procede a la creation des JMenuItem
		obtenirFormes = new JMenuItem("Obtenir formes");
		effacer = new JMenuItem("Effacer l'ecran");
		quitter = new JMenuItem("Quitter");

		//Menu ordre		
		trierRadio[0] = new JRadioButtonMenuItem("Aire");
		trierRadio[1] = new JRadioButtonMenuItem("No. de sequence");
		trierRadio[2] = new JRadioButtonMenuItem("Forme");
		trierRadio[3] = new JRadioButtonMenuItem("Plus grande distance");
		trierRadio[4] = new JRadioButtonMenuItem("Hauteur");
		trierRadio[5]= new JRadioButtonMenuItem("Largeur");
		trierRadio[6]= new JRadioButtonMenuItem("Remettre dans l'ordre original");

		//On procede a la creation de l'ecouteur de menu
		EcouteurMenu monEcouteurMenu = new EcouteurMenu(drawPanel);
		EcouteurMenu ecouteurMenuRadio = new EcouteurMenu(drawPanel);

		//On ajoute les ecouteur aux JMenuItems
		obtenirFormes.addActionListener(monEcouteurMenu);
		effacer.addActionListener(monEcouteurMenu);
		quitter.addActionListener(monEcouteurMenu);

		//pour qu'un seul bouton soit selectionné a la fois
		ButtonGroup buttonGroup = new ButtonGroup();
		ButtonGroup buttonGroupUpDown = new ButtonGroup();

		//gestion des boutons croiss-decroiss
		buttonGroupUpDown.add(triUp);
		buttonGroupUpDown.add(triDown);

		//Ajout des ecouteurs, et des boutons au menu
		for(JMenuItem item:trierRadio){
			item.addActionListener(ecouteurMenuRadio);
			ordre.add(item);
			buttonGroup.add(item);
		}

		//boutons de croissance, decroissance
		ordre.addSeparator();
		ordre.add(triUp);
		ordre.add(triDown);
		triUp.addActionListener(ecouteurMenuRadio);
		triDown.addActionListener(ecouteurMenuRadio);


		//On ajoute les JMenuItems au JMenu
		fichier.add(obtenirFormes);
		fichier.add(effacer);
		fichier.add(quitter);

		setSortMenuState(false);
	}

	/**
	 * Activation ou desactivation du menu de trie
	 * @param state Actif ou inactif (true ou false)
	 */
	private void setSortMenuState(boolean state){

		for(JMenuItem item:trierRadio){
			item.setEnabled(state);
		}

		triUp.setEnabled(state);
		triDown.setEnabled(state);
	}

	/**
	 * Classe interne representant l'ecouteur des JMenuItems
	 * Cet ecouteur fonctionne pour les quatres menus proposes dans cette application (5 juin 2011)
	 */
	public class EcouteurMenu implements ActionListener{

		//On va lui donner la reference au panneau
		DrawPanel panel;
		int lastSelectedSort;

		/**
		 * Constructeur de l'ecouteur du menu
		 * @param panel Le panneau par lequel on peut se connecter et se deconnecter
		 */
		public EcouteurMenu(DrawPanel panel){

			this.panel = panel;
		}

		@Override
		public void actionPerformed(ActionEvent actionEvent) {

			for(int i =0; i<trierRadio.length; i++){
				if(actionEvent.getSource() == trierRadio[i]){
					panel.sort(i,triUp.isSelected());
					lastSelectedSort = i;
				}
			}

			//si on choisit de changer la croiss-decroiss,
			//on re-update le tri avec le dernier type selectionne
			if(actionEvent.getSource() == triUp || actionEvent.getSource() == triDown)
				panel.sort(lastSelectedSort,triUp.isSelected());

			if(actionEvent.getSource() == obtenirFormes){ //Lorsque l'utilisateur clique sur le menu de connexion

				panel.clearAffichage();
				String adresse = JOptionPane.showInputDialog(D_ADRESSE_SERVEUR,defaultIP); //On lui demande l'adresse du serveur

				//Variable pour la r�cup�ration du port
				int port = 0;

				//Si l'utilisateur n'a pas clique "cancel", on demande le port
				if(adresse != null){

					try{ //On lui demande le numero du port sur lequel il veut se connecter

						port = Integer.parseInt(JOptionPane.showInputDialog(D_PORT_SERVEUR,DEFAULT_PORT));
					}catch(NumberFormatException nombreInvalide){ //Si le format de sa r�ponse n'est pas un entier

						//On lui dit et on annule la connexion
						JOptionPane.showMessageDialog(panel, F_PORT_INVALIDE);
						port = 0;
					}
				}


				//Si l'utilisateur a annule ou qu'il a entre un port invalide, on ne se connecte pas
				if(adresse != null && port != 0)
					try{
						//Sinon, on tente de se connecter
						panel.connectToServer(adresse, port);
						setSortMenuState(true);

					}catch(NullPointerException ex){

						System.out.println("null");
					}catch(UnknownHostException ex2){ //Si l'hote n'est pas valide, on avise l'utilisateur

						JOptionPane.showMessageDialog(panel, N_HOTE_INVALIDE);
					}catch(IOException ex3){ //Si aucun serveur n'est trouve sur ce port, on avise l'utilisateur

						JOptionPane.showMessageDialog(panel, S_INTROUVABLE + port);
					}catch(IllegalArgumentException ex4){ //Si le port n'est pas un port valide, on avise l'utilisteur

						JOptionPane.showMessageDialog(panel, PORT_INVALIDE);
					}
			}


			if(actionEvent.getSource() == effacer){ //Lorsque l'utilisateur demande d'effacer l'affichage

				panel.clearAffichage(); //On efface l'affichage
			}

			if(actionEvent.getSource() == quitter){ //Lorsque l'utilisateur demande de quitter

				//On confirme son choix
				int choix = JOptionPane.showConfirmDialog(getRootPane(), D_QUITTER, CONF_QUITTER, 0);

				if(choix == 0){ //Si on veut vraimen quitter, on quitte :(
					panel.end();
					System.exit(0);
				}
			}
		}
	}

}
